<script>
  // 给你两个整数 a 和 b ，不使用 运算符 + 和 - ​​​​​​​，计算并返回两整数之和。

  //   **** 题源：leetcode https://leetcode.cn/problems/sum-of-two-integers/

  //   示例 1：
  //   输入：a = 1, b = 2
  //   输出：3
  
  //   示例 2：
  //   输入：a = 2, b = 3
  //   输出：5

  //   &	AND	如果两位都是 1 则设置每位为 1
  //   |	OR	如果两位之一为 1 则设置每位为 1
  //   ^	XOR	如果两位只有一位为 1 则设置每位为 1
  //   ~	NOT	反转所有位
  //   <<	零填充左位移	通过从右推入零向左位移，并使最左边的位脱落。
  //   >>	有符号右位移	通过从左推入最左位的拷贝来向右位移，并使最右边的位脱落。
  //   >>>	零填充右位移	通过从左推入零来向右位移，并使最右边的位脱落。

  //   5 & 1	1	0101 & 0001	0001
  //   5 | 1	5	0101 | 0001	0101
  //   5 ^ 1	4	0101 ^ 0001	0100
  //   ~ 5	10	~0101	1010
  //   5 << 1	10	0101 << 1	1010
  //   5 >> 1	2	0101 >> 1	0010
  //   5 >>> 1	2	0101 >>> 1	0010

  /**
   * 分析
   *  题意是不要求我们使用运算符
   *  二进制是逢二进一
   *  那么根据这个 就可以 一开始 拿 a b & 一下 如果位数相同都是1  返回1
   *  那么 说明 当前都是1 相加 所以要向左位移 一个身位 存于current
   *  通过 ^ 比较 a b 如果两位只有一位为 1 则设置每位为 1 然后赋值给 a
   *  b = current
   *  循环 确定还有没有需要位运算的 如果current 得到0 说明相加结束
   *  如果昏了 就把 a设置为 5 b 设置为 1 测试一下
   */

  /**
   * @param {number} a
   * @param {number} b
   * @return {number}
   */
  var getSum = function (a, b) {
    while (b != 0) {
      var current = (a & b) << 1;
      a = a ^ b;
      b = current;
    }
    return a;
  };
</script>
